/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../impl/head.h"
#include "string_impl.h"

namespace xos_box
{
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static string_impl::ITEM_DATA xos_item_data;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    string_impl::string_impl()
    {
        init_data();
    }

    string_impl::~string_impl()
    {
        term();
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int string_impl::get_xos_item_data( ITEM_DATA *& item_ptr )
    {
        int ret = 0;
        xos_item_data.set_container( mgr::container() );
        item_ptr = &xos_item_data;
        return ret;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    const char * string_impl::get( char * lpszStr, size_t tSize ) const
    {
        xos::i_crt * pCrt = mgr::container()->crt();
        size_t tLen = m_str.length();
        if( lpszStr && ( tLen + 1 < tSize ) )
        {
            pCrt->strcpy( lpszStr, tSize, m_str.c_str() );
        }
        return m_str.c_str();
    }

    i_string * string_impl::get( i_string * pString )
    {
        if( pString )
        {
            pString->set( m_str.c_str(), (int)m_str.length() );
        }
        return this;
    }

    size_t string_impl::length() const
    {
        return m_str.length();
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    i_string * string_impl::set( const char * lpszStr, size_t tLen )
    {
        m_str.assign( lpszStr, tLen );
        return this;
    }

    i_string * string_impl::set( const char * lpszStr )
    {
        m_str.assign( lpszStr );
        return this;
    }

    i_string * string_impl::set( const i_string * pString )
    {
        const char * lpszStr = pString->get( 0, 0 );
        size_t tLen = pString->length();
        m_str.assign( lpszStr, tLen );
        return this;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    i_string * string_impl::append( const i_string * pString, const char seperator )
    {
        const char * lpszStr = pString->get( 0, 0 );
        size_t tLen = pString->length();
        return append( lpszStr, tLen, seperator );
    }

    i_string * string_impl::append( const char * lpszStr, size_t tLen, const char seperator )
    {
        int ret = 0;
        bool bSecondHasSep = false;
        bool bFirstHasSep = false;
        if( !lpszStr || ( 0 == lpszStr[0] ) || ( 0 == tLen ) )
        {
            ret = 1;
        }
        if( 0 == ret )
        {
            size_t len = m_str.length();
            if( ( len > 0 ) && ( seperator == m_str.at( len - 1 ) ) )
            {
                bFirstHasSep = true;
            }
        }
        if( ( 0 == ret ) && ( seperator == lpszStr[0] ) )
        {
            bSecondHasSep = true;
        }
        if( ( 0 == ret ) && bFirstHasSep && bSecondHasSep )
        {
            if( tLen > 1 )
            {
                m_str.append( lpszStr + 1, tLen - 1 );
            }
            ret = 1;
        }
        if( ( 0 == ret ) && !bFirstHasSep && !bSecondHasSep )
        {
            bFirstHasSep = true;
            m_str += seperator;
        }
        if( 0 == ret )
        {
            m_str.append( lpszStr, tLen );
        }
        return this;
    }

    i_string * string_impl::append( const char * lpszStr, const char seperator )
    {
        int ret = 0;
        if( !lpszStr || ( 0 == lpszStr[0] ) )
        {
            ret = 1;
        }
        if( 0 == ret )
        {
            size_t tLen = mgr::container()->crt()->strlen( lpszStr );
            append( lpszStr, tLen, seperator );
        }
        return this;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    i_string * string_impl::append( const i_string * pString )
    {
        const char * lpszStr = pString->get( 0, 0 );
        size_t tLen = pString->length();
        m_str.append( lpszStr, tLen );
        return this;
    }

    i_string * string_impl::append( const char * lpszStr )
    {
        m_str.append( lpszStr );
        return this;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    i_string * string_impl::url_append( const i_string * pString )
    {
        append( pString, '/' );
        return this;
    }

    i_string * string_impl::url_append( const char * lpszStr, size_t tLen )
    {
        append( lpszStr, tLen, '/' );
        return this;
    }

    i_string * string_impl::url_append( const char * lpszStr )
    {
        append( lpszStr, '/' );
        return this;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int string_impl::init_data()
    {
        int ret = 0;
        m_str = "";
        return ret;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int string_impl::init()
    {
        int ret = 0;
        return ret;
    }

    int string_impl::term()
    {
        int ret = 0;
        init_data();
        return ret;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

} // xos
